package com.a2.a2BDD;


import java.util.ArrayList;
import java.util.Date;

import com.a2.a2BDD.DatabaseHelper.TablaCampos;
import com.a2.a2BDD.DatabaseHelper.TablaTablas;
import com.a2.a2BDD.VariablesConstantesBD;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;


public class DatabaseHelperWrapper {
	public enum TipoCampo {
		ENTERO, ALFANUMERICO, PUNTO_FLOTANTE, BOOLEANO, DATETIME, AUTO_INC
	};

	public enum AtributoCampo {
		NINGUNO, NO_NULO, UNICO
	};

	public class Campo {
		private String nombre;
		private String descripcion;
		private String tipo;
		private String atributo;
		private int tamano;
		private int componente;
		private String datos;
		private String hint;
		private boolean autoinc = false;

		// public Campo(String nombreCampo, TipoCampo tipoCampo, int
		// tamanoCampo) {
		public Campo(String nombreCampo, String descripcionCampo,
				TipoCampo tipoCampo, int tamanoCampo, int componenteCampo,
				String datosCampo, String hintCampo) {
			this(nombreCampo, descripcionCampo, tipoCampo,
					AtributoCampo.NINGUNO, tamanoCampo, componenteCampo,
					datosCampo, hintCampo);
		}

		public Campo(String nombreCampo, String descripcionCampo,
				TipoCampo tipoCampo, AtributoCampo atributoCampo,
				int tamanoCampo, int componenteCampo, String datosCampo,
				String hintCampo) {

			nombre = nombreCampo;
			descripcion = descripcionCampo;			
			tamano = tamanoCampo;
			componente = componenteCampo;
			datos = datosCampo;
			hint = hintCampo;
			autoinc = tipoCampo == TipoCampo.AUTO_INC;

			switch (atributoCampo) {
			case NO_NULO:
				atributo = VariablesConstantesBD.ATRIB_NONULL_S;
				break;
			case UNICO:
				atributo = VariablesConstantesBD.ATRIB_PRIMARYK_S;
				break;
			default:
				atributo = VariablesConstantesBD.ATRIB_NULL_S;
				break;
			}

			switch (tipoCampo) {
			case ALFANUMERICO:
				tipo = "TEXT";
				break;
			case BOOLEANO:
			case ENTERO:
			case AUTO_INC:	
				tipo = "INTEGER";
				break;
			case PUNTO_FLOTANTE:
				tipo = "REAL";
				break;
			case DATETIME:
				tipo = "TIMESTAMP";
				//atributo = VariablesConstantesBD.ATRIB_PRIMARYK_S;//"NOT NULL DEFAULT current_timestamp";
				break;
			}
		}

		public String getNombre() {
			return nombre;
		}
		
		public String getDescripcion() {
			return descripcion;					
		}

		public String getTipo() {
			return tipo;
		}

		public String getAtributo() {
			return atributo;
		}
		
		public int getTamano() {
			return tamano;
		}
		
		public int getComponente() {
			return componente;
		}
		
		public String getDatos() {
			return datos;
		}
		
		public String getHint() {
			return hint;
		}
		
		public boolean getAutoinc() {
			return autoinc;
		}
	};

	private DatabaseHelper databaseHelper;
	private SQLiteDatabase db;

	public DatabaseHelperWrapper(Context contexto) {
		databaseHelper = new DatabaseHelper(contexto, null, 1);
		db = databaseHelper.getReadableDatabase();
	}

	public void crearNuevaTabla(String nombreTabla, String descripTabla, int grupoTabla, ArrayList<Campo> campos) {
		ArrayList<String> nombreCampos = new ArrayList<String>();
		ArrayList<String> tipoCampos = new ArrayList<String>();
		ContentValues cv = new ContentValues();
		long lcIDTabla = 0;		
		
		Date date = new Date();
		
		// Agregar registro en diccionario de tablas
		try {
			cv.put(TablaTablas.CAMPO_NOMBRE, nombreTabla);
			cv.put(TablaTablas.CAMPO_DESCRIPCION, descripTabla);			
			cv.put(TablaTablas.CAMPO_GRUPO, "");
			cv.put(TablaTablas.CAMPO_FECHA, date.getTime());			
			lcIDTabla = db.insert(TablaTablas.NOMBRE, null, cv);
		} finally {
			cv.clear();
		}
		
		for (int i = 0; i <= campos.size() - 1; i++) {
			nombreCampos.add(campos.get(i).nombre);
			tipoCampos.add(campos.get(i).tipo);
						
			// Agregar registro al diccionario de campos
			try {
				cv.put(TablaCampos.CAMPO_IDTABLA, lcIDTabla);
				cv.put(TablaCampos.CAMPO_NOMBRE, campos.get(i).getNombre());
				cv.put(TablaCampos.CAMPO_DESCRIPCION, campos.get(i).getDescripcion());
				cv.put(TablaCampos.CAMPO_TIPO, campos.get(i).getTipo());
				cv.put(TablaCampos.CAMPO_ATRIBUTO, campos.get(i).getAtributo());
				cv.put(TablaCampos.CAMPO_TAMANO, campos.get(i).getTamano());
				cv.put(TablaCampos.CAMPO_COMPONENTE, campos.get(i).getComponente());
				cv.put(TablaCampos.CAMPO_DATOS, campos.get(i).getDatos());
				cv.put(TablaCampos.CAMPO_HINT, campos.get(i).getHint());
				cv.put(TablaCampos.CAMPO_AUTOINC, campos.get(i).getAutoinc());
				
				db.insert(TablaCampos.NOMBRE, null, cv);		
								

			} finally {
				cv.clear();
			}
		}

		databaseHelper.createTabla(db, nombreTabla, nombreCampos, tipoCampos);
	}

	public long insertarDatos(String nombreTabla, ContentValues campoValor) {
		return db.insert(nombreTabla, null, campoValor);
	}

	public Cursor obtenerTablas() {
		return db.rawQuery("SELECT * FROM " + TablaTablas.NOMBRE, null);
	}

	public Cursor obtenerDatos(String nombreTabla) {
		return db.rawQuery("SELECT * FROM " + nombreTabla, null);
	}

	public Cursor obtenerCampos(Long idTabla) {
		return db.rawQuery("SELECT * FROM " + TablaCampos.NOMBRE + " WHERE "
				+ TablaCampos.CAMPO_IDTABLA + " == " + idTabla, null);
	}
	
	public Cursor obterLasRowId(String nombreTabla) {
		return db.rawQuery("SELECT MAX(ID) FROM " + nombreTabla, null);
	}//last_insert_rowid()

	public long modificarDatos(String nombreTabla, ContentValues campoValor,
			String where) {
		return db.update(nombreTabla, campoValor, where, null);
	}

	public void elimitarDatos(String nombreTabla, String where) {
		db.delete(nombreTabla, where, null);
	}

	public void eliminarTabla(Long idTabla) {
		String string_tmp = "";		
		
		Cursor cursor = db.rawQuery("SELECT " + TablaTablas.CAMPO_NOMBRE
				+ " FROM " + TablaTablas.NOMBRE + " WHERE "
				+ TablaTablas.CAMPO_ID + " == " + idTabla, null);		
		cursor.moveToFirst();
		string_tmp = cursor.getString(0);
		
		db.delete(TablaCampos.NOMBRE, TablaCampos.CAMPO_IDTABLA + " == "
				+ idTabla, null);
		
		db.delete(TablaTablas.NOMBRE, TablaTablas.CAMPO_ID + " == " + idTabla,
				null);
				
		db.execSQL("DROP TABLE IF EXISTS " + string_tmp);
		
	}

	public void close() {
		db.close();
	}
}
